package org.server;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.briup.smart.env.util.Backup;

/**
 * @program: env
 * @description: 备份模块的实现类
 * @author: rendc
 * @create: 2025-09-05 09:24
 **/
public class BackupImpl implements Backup {
    /**
     * 读取备份文件中存储的对象
     *
     * @param filePath 备份文件的路径
     * @param del      读取完备份文件后是否要删除此备份文件，true为删除，false为不删除。
     *                 在调用时推荐使用本接口中定义的静态常量LOAD_REMOVE、LOAD_UNREMOVE
     * @return 备份文件中存储的对象
     */
    @Override
    public Object load(String filePath, boolean del) {
        // 从 filePath 上 读取 obj ， del决定是否删除文件
        // 文件是否存在？
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            System.out.println("服务端：备份模块，备份文件" + filePath + "不存在");
            return null;
        }
        // 文件存在 有没有可能是空文件
        if (file.length() == 0) {
            System.out.println("服务端：备份模块，备份文件" + filePath + "内容为空，无数据可备份");
            return null;
        }
        // 文件是否可读？
        // 读取文件 获取 obj
        Object obj = null;
        try (
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
            obj = ois.readObject();
            System.out.println("服务端：备份模块，已读取到备份数据");
        } catch (Exception e) {
            e.printStackTrace();
        } // try()会自动关闭资源
        if (del) {
            // 删除备份文件
            boolean flag = file.delete();
            String str = flag ? "成功" : "失败";
            System.out.println("服务端：备份模块，备份文件删除" + str);
        }
        return obj;
    }

    /**
     * 将需要备份的集合对象写入到备份文件
     *
     * @param filePath 备份文件的路径
     * @param obj      将要写入备份文件的对象
     * @param append   在写入时追加还是覆盖，true为追加，false为覆盖,在调用时推荐使用接口中定义的静态常量STORE_APPEND、STORE_OVERRIDE
     */
    @Override
    public void store(String filePath, Object obj, boolean append) {
        // 将 obj 写入到 filePath 上 append 决定是否追加
        try (
                // 自动关闭资源
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath, append));) {
            oos.writeObject(obj);
            System.out.println("服务端：备份模块，成功写入备份文件，备份文件的路径" + filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
